home *** CD-ROM | disk | FTP | other *** search
- VERSION 5.00
- Begin VB.Form frmFlake
- Caption = "Flake"
- ClientHeight = 4335
- ClientLeft = 2280
- ClientTop = 900
- ClientWidth = 5070
- LinkTopic = "Form1"
- PaletteMode = 1 'UseZOrder
- ScaleHeight = 4335
- ScaleWidth = 5070
- Begin VB.TextBox txtTheta
- Height = 285
- Left = 600
- MaxLength = 3
- TabIndex = 1
- Text = "60"
- Top = 360
- Width = 375
- End
- Begin VB.TextBox txtDepth
- Height = 285
- Left = 600
- MaxLength = 3
- TabIndex = 0
- Text = "3"
- Top = 0
- Width = 375
- End
- Begin VB.PictureBox picCanvas
- AutoRedraw = -1 'True
- Height = 4335
- Left = 1080
- ScaleHeight = 285
- ScaleMode = 3 'Pixel
- ScaleWidth = 261
- TabIndex = 4
- Top = 0
- Width = 3975
- End
- Begin VB.CommandButton cmdGo
- Caption = "Go"
- Default = -1 'True
- Height = 375
- Left = 240
- TabIndex = 2
- Top = 840
- Width = 615
- End
- Begin VB.Label Label1
- Caption = "Theta"
- Height = 255
- Index = 1
- Left = 0
- TabIndex = 5
- Top = 360
- Width = 495
- End
- Begin VB.Label Label1
- Caption = "Depth"
- Height = 255
- Index = 0
- Left = 0
- TabIndex = 3
- Top = 0
- Width = 495
- End
- Attribute VB_Name = "frmFlake"
- Attribute VB_GlobalNameSpace = False
- Attribute VB_Creatable = False
- Attribute VB_PredeclaredId = True
- Attribute VB_Exposed = False
- Option Explicit
- Private Const PI = 3.14159
- ' Coordinates of the points in the initiator.
- Private Const NUM_INITIATOR_POINTS = 3
- Private InitiatorX(0 To NUM_INITIATOR_POINTS) As Single
- Private InitiatorY(0 To NUM_INITIATOR_POINTS) As Single
- ' Angles and distances for the generator.
- Private Const NUM_GENERATOR_ANGLES = 4
- Private ScaleFactor As Single
- Private GeneratorDTheta(1 To NUM_GENERATOR_ANGLES) As Single
- ' Draw the complete snowflake.
- Private Sub DrawFlake(ByVal depth As Integer, ByVal length As Single)
- Dim i As Integer
- Dim x1 As Single
- Dim y1 As Single
- Dim x2 As Single
- Dim y2 As Single
- Dim dx As Single
- Dim dy As Single
- Dim theta As Single
- picCanvas.Cls
- ' Draw the snowflake.
- For i = 1 To NUM_INITIATOR_POINTS
- x1 = InitiatorX(i - 1)
- y1 = InitiatorY(i - 1)
- x2 = InitiatorX(i)
- y2 = InitiatorY(i)
- dx = x2 - x1
- dy = y2 - y1
- theta = ATan2(dy, dx)
- DrawFlakeEdge depth, x1, y1, _
- theta, length
- Next i
- End Sub
- ' Recursively draw a snowflake edge starting at
- ' (x1, y1) in direction theta and distance dist.
- ' Leave the coordinates of the endpoint in
- ' (x1, y1).
- Private Sub DrawFlakeEdge(ByVal depth As Integer, ByRef x1 As Single, ByRef y1 As Single, ByVal theta As Single, ByVal dist As Single)
- Dim status As Integer
- Dim i As Integer
- Dim x2 As Single
- Dim y2 As Single
- If depth <= 0 Then
- x2 = x1 + dist * Cos(theta)
- y2 = y1 + dist * Sin(theta)
- picCanvas.Line (x1, y1)-(x2, y2)
- x1 = x2
- y1 = y2
- Exit Sub
- End If
- ' Recursively draw the edge.
- dist = dist * ScaleFactor
- For i = 1 To NUM_GENERATOR_ANGLES
- theta = theta + GeneratorDTheta(i)
- DrawFlakeEdge depth - 1, x1, y1, theta, dist
- Next i
- End Sub
- Private Sub CmdGo_Click()
- Dim depth As Integer
- Dim length As Single
- Dim theta As Single
- Dim unit As Single
- Dim vunit As Single
- Dim hunit As Single
- picCanvas.Cls
- MousePointer = vbHourglass
- DoEvents
- ' Get the parameters.
- If Not IsNumeric(txtDepth.Text) Then txtDepth.Text = "5"
- depth = CInt(txtDepth.Text)
- ' Initialize the generator.
- If Not IsNumeric(txtTheta.Text) Then txtTheta.Text = "60"
- theta = CInt(txtTheta.Text) / 180 * PI
- ' See how big we can make the curve.
- vunit = 0.8 * picCanvas.ScaleHeight / (Sqr(3) * 4 / 3)
- hunit = 0.8 * picCanvas.ScaleWidth / 2
- If vunit < hunit Then
- unit = vunit
- Else
- unit = hunit
- End If
- length = 2 * unit
- ' Initialize the generator and initializer.
- InitializeGenerator theta, length
- ' Draw the snowflake.
- DrawFlake depth, length
- MousePointer = vbDefault
- End Sub
- ' Initialize the generator for the indicated angle.
- Private Sub InitializeGenerator(ByVal theta As Single, ByVal length As Single)
- Dim xmid As Single
- Dim ymid As Single
- ' Initialize the initiator's coordinates.
- xmid = picCanvas.ScaleWidth / 2
- ymid = picCanvas.ScaleHeight / 2
- InitiatorX(1) = xmid + length / 2
- InitiatorY(1) = ymid - length / 2 * Sqr(3) / 3
- InitiatorX(2) = xmid - length / 2
- InitiatorY(2) = InitiatorY(1)
- InitiatorX(3) = xmid
- InitiatorY(3) = ymid + length / 2 * Sqr(3) * 2 / 3
- InitiatorX(0) = InitiatorX(3)
- InitiatorY(0) = InitiatorY(3)
- ScaleFactor = 1 / (2 * (1 + Cos(theta)))
- GeneratorDTheta(1) = 0
- GeneratorDTheta(2) = theta
- GeneratorDTheta(3) = -2 * theta
- GeneratorDTheta(4) = theta
- End Sub
- Private Sub Form_Resize()
- Dim wid As Single
- ' Make the picCanvas as big as possible.
- wid = ScaleWidth - picCanvas.Left
- If wid < 120 Then wid = 120
- picCanvas.Move picCanvas.Left, 0, wid, ScaleHeight
- End Sub
-